package io.gitee.milklynk.vo.response;

import com.alibaba.fastjson2.annotation.JSONField;
import io.gitee.milklynk.vo.enums.Role;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.List;

/**
 *模型生成的completion
 */
@Data
public class Choice {

    /**
     *该 completion 在模型生成的 completion 的选择列表中的索引。
     */
    @JSONField(name = "index")
    private Integer index;

    /**
     * 模型生成的 completion 消息。
     */
    @JSONField(alternateNames = {"message","delta"})
    private Message message;


    /**
     * 模型停止生成 token 的原因
     */
    @JSONField(name = "finish_reason")
    private String finishReason;

    /**
     * 接收: 该 choice 的对数概率信息
     */
    @JSONField(name = "logprobs")
    private Logprobs logprobs;

    /**
     * 模型生成的 completion 消息。
     */
    @EqualsAndHashCode(callSuper = true)
    @Data
    public static class Message extends io.gitee.milklynk.vo.request.Message {
        /**
         * 该消息的发起角色{@link Role}
         * 注意:在流模式下，此属性只在流开始的第一块存在
         */
        @JSONField(name = "role")
        private String role;

        /**
         * 消息的内容，在流模式下为部分内容
         *
         */
        @JSONField(name = "content")
        private String content;

        /**
         * (Beta) 设置此参数为 true，来强制模型在其回答中以此 assistant 消息中提供的前缀内容开始
         * 您必须设置 base_url="https://api.deepseek.com/beta" 来使用此功能。
         */
        @JSONField(name = "prefix")
        private Boolean prefix;

        /**
         * 仅适用于 deepseek-reasoner 模型。内容为 assistant 消息中在最终答案之前的推理内容。在流模式下为部分内容。
         */
        @JSONField(name = "reasoning_content")
        private String reasoningContent;

        /**
         * 模型生成的 tool 调用，例如 function 调用。
         */
        @JSONField(name = "tool_calls")
        private List<ToolCall> toolCalls;

        /** */
        @Data
        public static class ToolCall{
            /**
             * tool 调用的 ID。
             */
            @JSONField(name = "id")
            private String id;

            /**
             * tool 的类型。目前仅支持 function。
             */
            @JSONField(name = "type")
            private String type;

            /**
             * 模型调用的 function。
             */
            @JSONField(name = "function")
            private Function function;

            /** */
            @Data
            public static class Function{
                /**
                 * 模型调用的 function 名。
                 */
                @JSONField(name = "name")
                private String name;

                /**
                 * 要调用的 function 的参数，由模型生成，格式为 JSON。请注意，模型并不总是生成有效的 JSON，并且可能会臆造出你函数模式中未定义的参数。在调用函数之前，请在代码中验证这些参数。
                 */
                @JSONField(name = "arguments")
                private String arguments;

            }

        }


    }


    /**
     * choice 的对数概率信息。
     */
    @Data
    public static class Logprobs {
        /**
         * 一个包含输出 token 对数概率信息的列表。
         */
        @JSONField(name = "content")
        private List<Content> content;

        /** */
        @Data
        public static class Content{
            /**
             * 输出的 token。
             */
            @JSONField(name = "token")
            private String token;

            /**
             * 该 token 的对数概率。-9999.0 代表该 token 的输出概率极小，不在 top 20 最可能输出的 token 中。
             */
            @JSONField(name = "logprob")
            private Float logprob;

            /**
             * 一个包含该 token UTF-8 字节表示的整数列表。一般在一个 UTF-8 字符被拆分成多个 token 来表示时有用。如果 token 没有对应的字节表示，则该值为 null。
             */
            @JSONField(name = "bytes")
            private List<Integer> bytes;

            /**
             * 一个包含在该输出位置上，输出概率 top N 的 token 的列表，以及它们的对数概率。在罕见情况下，返回的 token 数量可能少于请求参数中指定的 top_logprobs 值。
             */
            @JSONField(name = "top_logprobs")
            private List<TopLogprob> topLogprobs;
            /** */
            @Data
            public static class TopLogprob{
                /**
                 * 输出的 token。
                 */
                @JSONField(name = "token")
                private String token;

                /**
                 * 该 token 的对数概率。-9999.0 代表该 token 的输出概率极小，不在 top 20 最可能输出的 token 中。
                 */
                @JSONField(name = "logprob")
                private Float logprob;

                /**
                 * 一个包含该 token UTF-8 字节表示的整数列表。一般在一个 UTF-8 字符被拆分成多个 token 来表示时有用。如果 token 没有对应的字节表示，则该值为 null。
                 */
                @JSONField(name = "bytes")
                private List<Integer> bytes;

            }


        }
    }



}
